home *** CD-ROM | disk | FTP | other *** search
- ***************************************************************************************
- * Pooled Memory routines, Assembler versions. *
- * Taken from "amiga_lib 40.14 (11/08/93)". *
- * *
- * All of these routines will use the exec.library routines if OS 3 or above is *
- * available. The routines will work with any version of AmigaOS from 1.2 onwards. *
- * *
- * AsmCreatePool newPool [a0] = (memFlags [d0],puddleSize [d1],threshSize [d2]) *
- * AsmDeletePool (poolHeader [a0]) *
- * AsmAllocPooled memory [d0] = (poolHeader [a0],memSize [d0]) *
- * AsmFreePooled (poolHeader [a0],memory [a1],memSize [d0]) *
- * *
- * See the autodocs for exec or amiga_lib for information on how they are used. *
- * *
- * Conversion to source code (with slight additions and adaptations) by *
- * Leo Davidson (Pot-Noodle / Gods'Gift Utilities). *
- * *
- * I have also added routines called Leo#? which are identical, but also do a *
- * "Move.l PoolHead(a5),a0" at the start of the routine. *
- ***************************************************************************************
-
- ;Test_Pool_On_OS3 ; Use assembled pool routines, even with OS3?
-
- ***************************************************************************************
-
- AsmCreatePool
- Move.l (AbsExecBase).w,a6 Execbase MUST be in a6.
- IFND Test_Pool_On_OS3
- Cmp.w #39,$0014(a6) -.
- Bcs.s AsmCreatePool_Routine |- Use OS lib if v39+ available.
- Jmp _LVOCreatePool(a6) -'
- ENDC
-
- AsmCreatePool_Routine
- Sub.l A0,A0
- Cmp.l D2,D1
- Bcs.s AsmCreatePooled_L1
- Move.l D0,-(SP)
- MoveQ.l #7,D0
- Add.l D0,D1
- Not.b D0
- And.b D0,D1
- Move.l D1,-(SP)
- MoveQ.l #0,D1
- MoveQ.l #$18,D0
- Jsr _LVOAllocMem(a6)
- Move.l (SP)+,D1
- Move.l (SP)+,A0
- Tst.l D0
- Beq.s AsmCreatePooled_L2
- Exg A0,D0
- Move.l A0,8(A0)
- Addq.l #4,A0
- Clr.l (A0)
- Move.l A0,-(A0)
- Lea 12(A0),A1
- Move.l D0,(A1)+
- Move.l D1,(A1)+
- Move.l D2,(A1)+
- AsmCreatePooled_L1
- Move.l A0,D0
- AsmCreatePooled_L2
- RTS
-
- LeoDeletePool
- Move.l PoolHead(a5),a0
- AsmDeletePool
- Move.l (AbsExecBase).w,a6 Execbase MUST be in a6.
- IFND Test_Pool_On_OS3
- Cmp.w #39,$0014(a6) -.
- Bcs.s AsmDeletePool_Routine |- Use OS lib if v39+ available.
- Jmp _LVODeletePool(a6) -'
- ENDC
-
- AsmDeletePool_Routine
- Move.l A0,D0
- Beq.s AsmDeletePool_L1
- MoveM.l D2/A2,-(SP)
- Move.l (A0),A2
- AsmDeletePool_L2
- Move.l (A2),D2
- Beq.s AsmDeletePool_L3
- Move.l A2,A1
- Move.l D2,A2
- Move.l -(A1),D0
- Jsr _LVOFreeMem(a6)
- Bra.s AsmDeletePool_L2
-
- AsmDeletePool_L1
- RTS
-
- AsmDeletePool_L3
- Move.l A2,A1
- Subq.l #4,A1
- MoveM.l (SP)+,D2/A2
- MoveQ.l #$18,D0
- Jmp _LVOFreeMem(a6)
-
- LeoAllocPooled
- Move.l PoolHead(a5),a0
- AsmAllocPooled
- Move.l (AbsExecBase).w,a6 Execbase MUST be in a6.
- IFND Test_Pool_On_OS3
- Cmp.w #39,$0014(a6) -.
- Bcs.s AsmAllocPooled_Routine |- Use OS lib if v39+ available.
- Jmp _LVOAllocPooled(a6) -'
- ENDC
-
- AsmAllocPooled_Routine
- Move.l D0,D1
- Beq.s AsmAllocPooled_L1
- Move.l A0,D0
- Beq.s AsmAllocPooled_L1
- MoveM.l D2/D3/A2/A3,-(SP)
- Move.l D1,D2
- Move.l A0,A2
- Cmp.l $0014(A2),D2
- Bcc.s AsmAllocPooled_L2
- AsmAllocPooled_L3
- Move.l (A2),D3
- AsmAllocPooled_L4
- Move.l D3,A3
- Move.l (A3),D3
- Beq.s AsmAllocPooled_L5
- Move.l A3,A0
- Tst.l 8(A0)
- Beq.s AsmAllocPooled_L5
- Move.l D2,D0
- Jsr _LVOAllocate(a6)
- Tst.l D0
- Beq.s AsmAllocPooled_L4
- Move.l D0,A0
- Move.l 12(A2),D0
- BTst #$10,D0
- Beq.s AsmAllocPooled_L6
- Move.l A0,A1
- Move.l D2,D1
- Addq.l #7,D1
- Lsr.l #3,D1
- Subq.l #1,D1
- Move.w D1,D0
- SWAP D1
- MoveQ.l #0,D3
- AsmAllocPooled_L7
- Move.l D3,(A1)+
- Move.l D3,(A1)+
- DBra D0,AsmAllocPooled_L7
- DBra D1,AsmAllocPooled_L7
- AsmAllocPooled_L6
- Move.l A0,D0
- AsmAllocPooled_L8
- MoveM.l (SP)+,D2/D3/A2/A3
- AsmAllocPooled_L1
- RTS
-
- AsmAllocPooled_L2
- Move.l D2,D0
- Addq.l #8,D0
- Addq.l #4,D0
- Move.l 12(A2),D1
- Bsr AsmAllocPooled_L9
- Tst.l D0
- Beq.s AsmAllocPooled_L8
- Move.l D0,A1
- Move.l A2,A0
- Addq.l #4,A0
- Move.l 4(A0),D0
- Move.l A1,4(A0)
- Exg A0,D0
- MoveM.l D0/A0,(A1)
- Move.l A1,(A0)
- Addq.l #8,A1
- Clr.l (A1)+
- Move.l A1,D0
- Bra.s AsmAllocPooled_L8
-
- AsmAllocPooled_L5
- Move.l 12(A2),D1
- Move.l $0010(A2),D0
- Add.l #$00000024,D0
- Bsr.s AsmAllocPooled_L9
- Tst.l D0
- Beq.s AsmAllocPooled_L8
- Move.l D0,A3
- Move.l D0,A1
- Move.l A2,A0
- Move.l (A0),D0
- Move.l A1,(A0)
- MoveM.l D0/A0,(A1)
- Move.l D0,A0
- Move.l A1,4(A0)
- MoveQ.l #10,D0
- Move.b D0,8(A3)
- Move.b D0,9(A3)
- Lea Pool.MSG(PC),A0
- Move.l A0,10(A3)
- Move.l 12(A2),D1
- Move.w D1,14(A3)
- Lea $0024(A3),A0
- MoveQ.l #7,D1
- Not.l D1
- Move.l A0,D0
- And.l D0,D1
- Move.l D1,A0
- Move.l $0010(A2),D0
- Move.l A0,$0010(A3)
- Move.l A0,$0014(A3)
- Move.l D0,$001C(A3)
- Clr.l (A0)
- Move.l D0,4(A0)
- Add.l D0,A0
- Move.l A0,$0018(A3)
- Bra AsmAllocPooled_L3
-
- AsmAllocPooled_L9
- Addq.l #4,D0
- Move.l D0,-(SP)
- Jsr _LVOAllocMem(a6)
- Tst.l D0
- Beq.s AsmAllocPooled_L10
- Move.l D0,A0
- Move.l (SP),(A0)+
- Move.l A0,D0
- AsmAllocPooled_L10
- Addq.l #4,SP
- RTS
-
- LeoFreePooled
- Move.l PoolHead(a5),a0
- AsmFreePooled
- Move.l (AbsExecBase).w,a6 Execbase MUST be in a6.
- IFND Test_Pool_On_OS3
- Cmp.w #39,$0014(a6) -.
- Bcs.s AsmFreePooled_Routine |- Use OS lib if v39+ available.
- Jmp _LVOFreePooled(a6) -'
- ENDC
-
- AsmFreePooled_Routine
- Move.l A0,D1
- Beq.s AsmFreePooled_L1
- Move.l A1,D1
- Beq.s AsmFreePooled_L1
- Cmp.l $0014(A0),D0
- Bcc.s AsmFreePooled_L2
- Move.l A3,-(SP)
- Move.l (A0),D1
- AsmFreePooled_L3
- Move.l D1,A3
- Move.l (A3),D1
- Beq.s AsmFreePooled_L4
- Tst.l 8(A3)
- Beq.s AsmFreePooled_L4
- Cmp.l $0014(A3),A1
- Bcs.s AsmFreePooled_L3
- Cmp.l $0018(A3),A1
- Bcc.s AsmFreePooled_L3
- Move.l A3,A0
- Jsr _LVODeallocate(a6)
- Move.l 4(A3),A1
- Move.l 4(A1),D1
- Beq.s AsmFreePooled_L5
- Move.l D1,A0
- Move.l A3,(A0)
- Move.l A0,4(A3)
- Move.l A3,4(A1)
- Move.l (A3),A0
- Move.l A0,(A1)
- Move.l A1,4(A0)
- Move.l A1,(A3)
- AsmFreePooled_L5
- Move.l A3,A1
- Move.l (SP)+,A3
- Move.l $0020(A1),D0
- Add.l $0014(A1),D0
- Sub.l $0018(A1),D0
- Beq.s AsmFreePooled_L6
- AsmFreePooled_L1
- RTS
-
- AsmFreePooled_L2
- Subq.l #4,A1
- Subq.l #8,A1
- AsmFreePooled_L6
- Move.l A1,D0
- Move.l (A1)+,A0
- Move.l (A1),A1
- Move.l A0,(A1)
- Move.l A1,4(A0)
- Move.l D0,A1
- Move.l -(A1),D0
- Jmp _LVOFreeMem(a6)
-
- AsmFreePooled_L4
- Move.l (SP)+,A3
- Move.l D7,-(SP)
- Move.l #$0100000F,D7
- Jsr _LVOAlert(a6)
- Move.l (SP)+,D7
- RTS
-
- Dc.b 0
- Pool.MSG
- Dc.b 'Pool',0
- Even
-